In multi-processing environments, it may be desirable to enhance the overall performance of a multithreaded system or program. In a massively multithreaded system, determining the appropriate optimization approach may become very difficult and cumbersome due to the variations in the performance characteristics of individual applications and the large number of threads that are concurrently executed. Indeed, individual analysis of each single thread will be a daunting task.
Instead of analyzing each thread individually, the analysis may be performed collectively (i.e., by way of aggregated analysis). An aggregation approach, however, does not always yield a proper solution because important data that is applicable to individual threads may be abstracted away. For example, if a relatively large number of secondary threads are underperforming, due to problems associated with an individual primary thread that services them, an aggregated analysis would reflect that the multitudes of secondary threads are slightly underperforming, while obscuring significant underperformance associated with the primary thread.
In the above example, if the underperformance of the primary thread goes undetected, then a human operator, such as a system administrator, will mistakenly focus on optimizing the secondary threads instead, a prospective solution that would not lead to an improvement of the overall performance of the system. As such, one would appreciate that in a massively multithreaded environment, it is important to identify and select the appropriate threads for optimization.
Furthermore, the modern computing systems are so complex that substantial time and extensive understanding of the involved software, hardware, and the relevant tools are essential to performing a proper analysis of all system aspects that possibly affect performance, and the degree in which such factors affect performance. Therefore, it is desirable to have a tool that can help automatically focus the optimization efforts in a more promising direction.